<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>数组合并与切片</title>
</head>
<body>
  <script>
    /* 
      1. concat()
        语法: var new_array = old_array.concat(value1[, value2[, ...[, valueN]]]) 
        功能: 将n个数组或值与当前数组合并生成一个新数组
    */
    Array.prototype.concat = function (...values) {
      const arr = [...this]
      values.forEach(value => { 
        if (Array.isArray(value)) {
          arr.push(...value)
        } else {
          arr.push(value)
        }
      })
      return arr
    }
    
    /* 
    2. slice()
        语法: var new_array = oldArr.slice([begin[, end]])
        功能: 返回一个由 begin 和 end 决定的原数组的浅拷贝, 原始数组不会被改变
     */
    Array.prototype.slice = function (begin, end) {
      // 如果当前数组是[], 直接返回[]
      if (this.length===0) {
        return []
      }

      // 如果begin超过最大下标, 直接返回[]
      begin = begin || 0
      if (begin>=this.length) {
        return []
      }

      // 如果end不大于begin, 直接返回[]
      end = end || this.length
      if (end > this.length) {
        end = this.length
      }
      if (end<=begin) {
        return []
      }

      // 取出下标在[begin, end)区间的元素, 并保存到最终的数组中
      const arr = []
      for (let index = begin; index < end; index++) {
        arr.push(this[index])
      }
      
      return arr
    }
    
  </script>

  <script>
    console.log([1, 2].concat([3, 4], 6))  // [1, 2, 3, 4, 6]

    console.log([1, 3, 5, 7, 9].slice())  // [1, 3, 5, 7, 9]
    console.log([1, 3, 5, 7, 9].slice(1, 3)) // [3, 5]
    console.log([1, 3, 5, 7, 9].slice(1, 10)) // [3, 5, 7, 9]
  </script>
</body>
</html>